"use strict";

const fs = require("node:fs");
const http = require("node:http");
const path = require("node:path");

// === 配置 ===
const PAC_PATH = path.resolve(__dirname, "./pac.pac"); // PAC 文件的绝对路径
const PORT = 6009; // 本地服务器监听端口
const HOST = "127.0.0.1"; // 监听地址（仅本地）

let pacContent = ""; // 缓存当前的 PAC 文件内容

// === 初始化加载 PAC 文件 ===
/**
 * @returns {void}
 */
function loadPACFile() {
  try {
    pacContent = fs.readFileSync(PAC_PATH, "utf8"); // 读取 PAC 文件内容
    console.log(`[PAC] 已加载 PAC 文件：${PAC_PATH}`);
  } catch (err) {
    if (err instanceof Error) {
      console.error("[PAC] 加载 PAC 文件失败：", err.message);
    }
  }
}

// === 监听 PAC 文件变更，实现热更新 ===
/**
 * @returns {void}
 */
function watchPACFile() {
  fs.watch(PAC_PATH, (eventType) => {
    if (eventType === "change") {
      console.log("[PAC] 检测到文件变化，重新加载...");
      loadPACFile();
    }
  });
}

// === 启动 HTTP 服务，提供 PAC 文件 ===
/**
 * @returns {void}
 */
function startServer() {
  http
    .createServer((req, res) => {
      if (req.url === "/pac.pac") {
        // 请求路径为 /proxy.pac 时返回 PAC 内容
        res.writeHead(200, {
          "Content-Type": "application/x-ns-proxy-autoconfig",
        });
        res.end(pacContent);
        console.log(`[PAC] 已响应 PAC 请求：${req.socket.remoteAddress}`);
      } else {
        // 其他路径返回 404
        res.writeHead(404, { "Content-Type": "text/plain" });
        res.end("Not Found");
      }
    })
    .listen(PORT, HOST, () => {
      console.log(`[PAC] 本地服务器已启动：http://${HOST}:${PORT}/pac.pac`);
    });
}

// === 主程序入口 ===
loadPACFile(); // 加载初始 PAC 内容
watchPACFile(); // 启动监听文件变化
startServer(); // 启动本地 HTTP 服务
